package spring.cloud.tasks.executor.api;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import spring.cloud.tasks.executor.task.TaskItemExecuteResult;

@Slf4j
@Setter
@Getter
public abstract class BizTask {


    /**
     * 作业启用后，执行该方法。
     *
     * @param jobName 作业名
     */
    public void onEnabled(String jobName) {
    }

    /**
     * 作业禁用后，执行该方法。
     *
     * @param jobName 作业名
     */
    public void onDisabled(String jobName) {
    }

    /**
     * Java作业处理入口
     *
     * @param taskId               作业名
     * @param taskItemIndex        分片项
     * @param shardParam           分片参数
     * @param taskExecutionContext 其它参数信息
     * @return 返回执行结果
     * @throws InterruptedException 注意处理中断异常
     */
    public abstract TaskItemExecuteResult execute(String taskId, Integer taskItemIndex, String shardParam, TaskItemExecuteContext taskExecutionContext) throws InterruptedException;

    /**
     * 超时强杀之前调用此方法
     *
     * @param jobName         作业名
     * @param shardItem       分片项
     * @param shardParam      分片参数
     * @param shardingContext 其它参数信息
     */
    public void beforeTimeout(String jobName, Integer shardItem, String shardParam, TaskItemExecuteContext shardingContext) {
        // 由作业类实现逻辑
    }

    /**
     * 超时强杀之后调用此方法
     *
     * @param jobName         作业名
     * @param shardItem       分片项
     * @param shardParam      分片参数
     * @param shardingContext 其它参数信息
     */
    public void postTimeout(String jobName, Integer shardItem, String shardParam, TaskItemExecuteContext shardingContext) {
        // 由作业类实现逻辑
    }

    /**
     * 在saturn-console对作业立即终止，或者优雅退出超时，或者与zk失去连接时，都会在强杀业务线程之前调用此方法。
     * <p>
     * 注意，作业执行超时，强杀之前不会调用此方法，而是调用{@link #beforeTimeout(String, Integer, String, TaskItemExecuteContext)}方法。
     *
     * @param jobName         作业名
     * @param shardItem       分片项
     * @param shardParam      分片参数
     * @param shardingContext 其它参数信息
     */
    public void beforeForceStop(String jobName, Integer shardItem, String shardParam, TaskItemExecuteContext shardingContext) {
        // 由作业类实现逻辑
    }

    /**
     * 在saturn-console对作业立即终止，或者优雅退出超时，或者与zk失去连接时，都会在强杀业务线程之后调用此方法。
     * <p>
     * 注意，作业执行超时，强杀之后不会调用此方法，而是调用{@link #postTimeout(String, Integer, String, TaskItemExecuteContext)}方法。
     *
     * @param jobName         作业名
     * @param shardItem       分片项
     * @param shardParam      分片参数
     * @param shardingContext 其它参数信息
     */
    public void postForceStop(String jobName, Integer shardItem, String shardParam, TaskItemExecuteContext shardingContext) {
        // 由作业类实现逻辑
    }

}
